package com.lg.okframe.study.thread;

import android.os.SystemClock;
import android.util.Log;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 *
 * 线程池概念
 *
 * Created by LG on 2018/8/21.
 */

public class ThreadPool {

    /**
     * Android 中最常见的有四类线程池。分别是 FixedThreadPool、CachedThreadPool、ScheduledThreadPool 和 SingleThreadExecutor。
     FixedThreadPool：线程数量固定的线程池，只有核心线程并且核心线程不会被回收，所以他能更加快速的响应外界的请求。没有超时机制，任务队列也没有大小限制。
     CachedThreadPool：他是一种线程数量不定的线程池，它只有非核心线程，而且最大线程数为 Integer.MAX_VALUE，因为这个是很大的数，相当于最大线程数可以任意大。它比较适合执行大量的耗时较少的任务，当整个线程池都处于闲置状态时，线程池中的线程都会超时而被停止。
     ScheduledThreadPool：它的核心线程数量时固定的，但是非核心线程数时没有限制的。并且当非核心线程闲置时会立即回收。主要用于执行定时任务和具有固定周期的重复任务。
     SingleThreadExecutor：这个线程池内部只有一个核心线程，他确保所有的任务都在同一个线程中按顺序执行。它的意义在于统一所有的外部任务到一个线程中，使这些任务之间不需要处理线程同步问题。
     */
    public void runr(){

        Runnable command = new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(2000);
                Log.e("执行线程","执行线程！");
            }
        };

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
        fixedThreadPool.execute(command);

        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        cachedThreadPool.execute(command);

        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
        // 2000ms后执行command
        scheduledThreadPool.schedule(command,2000, TimeUnit.MILLISECONDS);
        // 延迟10ms后，每隔1000ms执行一次
        scheduledThreadPool.scheduleAtFixedRate(command,10,1000,TimeUnit.MILLISECONDS);

        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        singleThreadExecutor.execute(command);


    }


}
